【Batch批处理】for循环全参数详解和实例演示

您所在的位置:网站首页 cmd 参数传递字符串 等号 【Batch批处理】for循环全参数详解和实例演示

【Batch批处理】for循环全参数详解和实例演示

2023-08-16 05:54| 来源: 网络整理| 查看: 265

文章目录 简单介绍使用方法详解常规使用参数详解`/D`参数`/D /R`参数`/R`参数`/L`参数`/F`参数 使用场景总结

在上一篇文章中,我们知道了用goto加标签的方式实现了简单的while循环。但是对于一些比较复杂的循环,例如对特定命名规则的文件或文件夹批量删除,多个文件的内容批量读取和处理等等,while循环是捉襟见肘的,这个时候就需要for循环来帮忙了。这一节我们就来看看for循环都有哪些用法。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

简单介绍

跑for /?可以看到官方文档是这样定义for的:对一系列文件中的每一个文件依次跑一个命令

Runs a specified command for each file in a set of files.

所以常规情况下,for循环是用来处理一堆文件的。但是不同的参数又赋予了for循环非常强大的附加功能,下面我们会看到。

使用方法详解 常规使用

还是根据官方文档,不加任何额外参数的情况下,语法如下

FOR %variable IN (set) DO command [command-parameters] %variable Specifies a single letter replaceable parameter. (set) Specifies a set of one or more files. Wildcards may be used. command Specifies the command to carry out for each file. command-parameters Specifies parameters or switches for the specified command. To use the FOR command in a batch program, specify %%variable instead of %variable. Variable names are case sensitive, so %i is different from %I.

需要注意的是,在命令行中使用一个%表示变量,在批处理文件中需要两个%。和批处理中大多数参数一样,这里的变量名或者参数大小写都不敏感

例如:将所有temp开头的文件都移动到folder1中

::for loop test @echo off for %%a in (temp*) do copy %%a folder1 exit /b

批处理中的通配符有俩个,*表示多个字符,?表示单个字符

这里没加任何参数,表示的只是当前目录下的文件,并不会进入子文件夹进行查找。想要进入子文件进行遍历需要用到后面介绍的参数。

执行效果如下

c:\Batch\test>for.bat 1 file(s) copied. 1 file(s) copied.

如果想要执行的命令有多个,需要用小括号围起来。

例如:移动之前显示一下文件名字

::for loop test @echo off for %%a in (temp*) do ( echo %%a copy %%a folder1) exit /b

执行效果如下

c:\Batch\test>for.bat temp1.txt 1 file(s) copied. temp2.txt 1 file(s) copied. 参数详解

for循环的参数还是相当多的,对照着官方文档我们一个个来看,这里省略了一些说明文字

If Command Extensions are enabled, the following additional forms of the FOR command are supported: FOR /D %variable IN (set) DO command [command-parameters] FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] FOR /L %variable IN (start,step,end) DO command [command-parameters] FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %variable IN ("string") DO command [command-parameters] FOR /F ["options"] %variable IN ('command') DO command [command-parameters] /D参数

如果(set)是文件夹,而非文件时,需要用到这个参数

例如:删除所有temp开头的文件夹

::for loop test @echo off for /d %%a in (temp*) do ( echo %%a rd %%a) exit /b /D /R参数

加上/R表示进入子文件夹进行遍历查找

例如:将所有temp开头的文件夹移动到最外层目录的外面

::for loop test @echo off for /d /r %%a in (temp*) do ( echo %%a move %%a ..) exit /b

执行效果如下,可以看到子目录里面的文件夹也被移动了

c:\Batch\test>for.bat c:\Batch\test\temp2 1 dir(s) moved. c:\Batch\test\folder1\temp1 1 dir(s) moved. /R参数

单独使用/R表示指定路径

例如:删除目录c:\Batch\test\folder2下面所有temp开头的文件

::for loop test @echo off for /r c:\Batch\test\folder2 %%a in (temp*) do ( echo %%a del %%a) exit /b

如果/r后面不接任何路径,就会遍历当前目录以及所有子目录下所有文件

例如:将本目录以及子目录中所有log文件复制到外层目录

::for loop test @echo off for /r %%a in (*.log) do ( echo %%a copy %%a ..) exit /b

删除子目录下的文件可能会遇到报错 the system cannot find the file specified,建议用del *.log /s去完成删除

/L参数

如果(set)是一串数字需要用到/L参数,(set)的格式为(起始值,步长,结束值)

例如:打印0-30的所有偶数

::for loop test @echo off for /l %%a in (0,2,30) do ( echo %%a) exit /b

运行结果如下

c:\Batch\test>for.bat 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 /F参数

这个参数官方文档给了3种应用场景,但是总结起来其实就是一个,那就是处理字符串。要么(set)直接就是一个字符串;要么(set)就是几个文件,会将文件内容读取出来做为多行字符串来处理;要么(set)是一个命令,会将命令的结果做为多行字符串进行处理

不带参数 不带参数的情况下,以空格做为分隔符,将一个长的字符串分割为多个子字符串,官方文档叫token,获取从左往右第一个token赋值给变量,例如 c:\Batch\test>for /f %a in ("life is wonderful") do echo %a c:\Batch\test>echo life life

读取文件内容,处理多行字符串。需要注意的是这里的文件名不支持通配符

c:\Batch\test>type temp1.txt life is wonderful c:\Batch\test>type temp2.txt today is Sunday c:\Batch\test>for /f %a in (temp1.txt temp2.txt) do echo %a c:\Batch\test>echo life life c:\Batch\test>echo today today c:\Batch\test>

获取命令结果,进行再次处理

c:\Batch\test>for /f %a in ('dir /b') do echo %a 带参数 这应该是for循环比较难理解的地方。参数常用的有两个,一个叫tokens,后面接从1开始的整数,表示取第几个token传递给变量;还有一个叫delims,后面接一个符号用来代替默认的空格做为分隔符。这里面需要注意的是token数目多于一个的时候,变量名需要按照字母顺序表的方式去依次往后排来获取下一个token,例如%a表示第一个token,那么%b用来表示第二个token,依次类推。例如 c:\Batch\test>type temp1.txt life is wonderful c:\Batch\test>type temp2.txt today is Sunday c:\Batch\test>for /f "tokens=1,3,4" %a in (temp1.txt temp2.txt) do echo %a+%b+%c c:\Batch\test>echo life+wonderful+ life+wonderful+ c:\Batch\test>echo today+Sunday+ today+Sunday+

从上面的例子可以看出三点:和很多编程语言不同,token是从1开始取值的;当token不是连续的时候,变量名还是要连续;变量名没有内容的时候不会报错,而是返回空值

再例如打印所有环境变量的内容

for /f "tokens=1-2 delims==" %a in ('set') do echo %b

这里就是以等号做为分隔符,返回两个token,然后打印出第二个token。这里也用了tokens的第二种表达方式,用短线表示取值范围

实测这里的命令不支持管道符号

使用场景

其实对参数的总结也基本就是所有的应用场景了

对文件或者文件夹进行遍历处理类似while循环对数字进行循环处理(但是只针对明确的数字集合)字符串的分割处理多个文件内容的按行遍历处理 总结

for循环算是批处理中比较难懂的一个语法,主要是因为和其他语言的格式区别太大,只有通过多多练习才能熟练掌握。

我这里抛砖引玉,希望大家能通过这一节的总结获得帮助。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3